package com.xing.binbackend.pattern.adapter24.ecommerce;

import com.xing.binbackend.pattern.adapter24.ecommerce.model.Order;
import com.xing.binbackend.pattern.adapter24.ecommerce.model.PayRequest;
import com.xing.binbackend.pattern.adapter24.ecommerce.model.PayResult;

/**
 * 通过两个适配器统一新旧版接口差异
 * 客户端仅依赖 PaymentGateway 接口，无需感知底层
 * “老版本WeChatPay”和“新版本WeChatPay”，以及适配器的作用。
 * 需要明确适配器在这里的角色，可能是将旧版本的接口适配到新版本，或者相反。
 * 比如，如果新版本的接口发生了变化，适配器可以转换旧接口的调用到新版本的实现，或让旧版本适配到新的统一接口。
 * 比如，旧版本的WeChatPay可能有不同的方法签名，而新版本可能改变了方法，
 * 这时候适配器可以将旧版本的调用转换为新版本的接口，或者反之。
 *
 * 如何实现新旧版本的共存和切换，以及适配器如何起到桥梁作用。
 * 需要分步骤说明配置的方式、适配器的实现以及实际调用的例子。
 *
 */
public class Client {
    // 根据配置注入适配器（新/旧版）
    private final IPayment payment;

    public Client(IPayment payment) {
        this.payment = payment;
    }

    public void processOrder(Order order) {
        PayRequest request = new PayRequest(order.getId(), order.getTotalAmount(),
                order.getOpenId());
        PayResult result = payment.pay(request);
        if (!result.isSuccess()) {
            // 自定义异常
            throw new RuntimeException("exception");
        }
    }
}
